<!DOCTYPE html> 
<html> 
  <head> 
    <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> 
    <title>Mac applications and developer tools from BinaryAge</title>     
    <meta name="title" content="Mac applications and developer tools from BinaryAge" />  
    <meta name="description" content="BinaryAge - the creator of innovative Mac applications and tools for developers." /> 
    <meta name="keywords" content="binaryage,antonin hildebrand,totalfinder,total commander,finder,visor,firequery,firelogger,firerainbow,xrefresh,drydrop,hashpage,productivity,mac,indie,software" /> 
    
    <link rel="image_src" href="/images/totalfinder-screenshot-tabs.png" /> 
    
    <meta name="google-site-verification" content="N_xzdr6ymSUQFhAEvQg7f-sp1JAeJCdW2JuaRg-da0w" /> 
     <link href="http://www.google.com/profiles/antonin.hildebrand" rel="me" type="text/html" /> 
    <link href="http://feeds.feedburner.com/binaryage-blog" type="application/atom+xml" rel="alternate" title="Ideas from BinaryAge" /> 
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"> 
    <link rel="icon" href="/favicon.ico" type="image/x-icon"> 
    <link rel="stylesheet" href="/shared/css/site.css" type="text/css"> 
 
    
    
    
    <!-- SCRIPTS START --> 
    <script type="text/javascript" charset="utf-8"> 
    /*
    CSS Browser Selector v0.3.5 (Feb 05, 2010)
    Rafael Lima (http://rafael.adm.br)
    http://rafael.adm.br/css_browser_selector
    License: http://creativecommons.org/licenses/by/2.5/
    Contributors: http://rafael.adm.br/css_browser_selector#contributors
    */
    function css_browser_selector(u){var ua = u.toLowerCase(),is=function(t){return ua.indexOf(t)>-1;},g='gecko',w='webkit',s='safari',o='opera',h=document.documentElement,b=[(!(/opera|webtv/i.test(ua))&&/msie\s(\d)/.test(ua))?('ie ie'+RegExp.$1):is('firefox/2')?g+' ff2':is('firefox/3.5')?g+' ff3 ff3_5':is('firefox/3')?g+' ff3':is('gecko/')?g:is('opera')?o+(/version\/(\d+)/.test(ua)?' '+o+RegExp.$1:(/opera(\s|\/)(\d+)/.test(ua)?' '+o+RegExp.$2:'')):is('konqueror')?'konqueror':is('chrome')?w+' chrome':is('iron')?w+' iron':is('applewebkit/')?w+' '+s+(/version\/(\d+)/.test(ua)?' '+s+RegExp.$1:''):is('mozilla/')?g:'',is('j2me')?'mobile':is('iphone')?'iphone':is('ipod')?'ipod':is('mac')?'mac':is('darwin')?'mac':is('webtv')?'webtv':is('win')?'win':is('freebsd')?'freebsd':(is('x11')||is('linux'))?'linux':'','js']; c = b.join(' '); h.className += ' '+c; return c;}; css_browser_selector(navigator.userAgent);        
    </script> 
    <script type="text/javascript" charset="utf-8"> 
        // define dummy replacements for firebug functionality (needed for Opera)
        if (!window.console) {
            window.console = {};
            function fn() {
                opera.postError(arguments);
            };
            ['log', 'debug', 'info', 'warn', 'error', 'assert', 'dir', 'dirxml', 'group', 'groupEnd', 
            'time', 'timeEnd', 'count', 'trace', 'profile', 'profileEnd'].forEach(function(name) {
                window.console[name] = fn;
            });
        }            
        (function() {
                var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
                if(!window.console){
                    window.console = {};
                }
                for (var i in names) {
                    window.console[names[i]] = window.console[names[i]] || function(){
                        return;
                    };
                }
        })();
    </script> 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script> 
    
    <script src="/shared/js/code.js"></script> 
    
    
    
    <script type="text/javascript"> 
      var _gaq = _gaq || [];
      _gaq.push(['_setAccount', 'UA-8404259-1']);
      _gaq.push(['_setDomainName', '.binaryage.com']);
      _gaq.push(['_trackPageview']);
      (function() {
        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
      })();
    </script> 
    
    
    <script type="text/javascript"> 
    SSTracker = { states: [] };
    SSTracker.setState = function(state) {
        var x = this;
        setTimeout(function() {
            if (x.states.length>1) {
                console.error('SS: reset state while some on stack');
            }
            if (state) {
                SSTracker.states = [state];
            } else {
                SSTracker.states = [];
            }
        }, 0);
    };
    SSTracker.pushState = function(state) {
        setTimeout(function() {
            SSTracker.states.push(state);
        }, 0);
    };
    SSTracker.popState = function(state) {
        setTimeout(function() {
            SSTracker.states.pop();
        }, 0);
    };
    SSTracker.track = function(env) {
        if (!env) {
            env = {};
        }
        
        // https://github.com/carhartl/jquery-cookie
        var cookie = function (key, value, options) {
            // key and at least value given, set cookie...
            if (arguments.length > 1 && String(value) !== "[object Object]") {
                options = options || {};
 
                if (value === null || value === undefined) {
                    options.expires = -1;
                }
 
                if (typeof options.expires === 'number') {
                    var days = options.expires, t = options.expires = new Date();
                    t.setDate(t.getDate() + days);
                }
 
                value = String(value);
 
                return (document.cookie = [
                    encodeURIComponent(key), '=',
                    options.raw ? value : encodeURIComponent(value),
                    options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
                    options.path ? '; path=' + options.path : '',
                    options.domain ? '; domain=' + options.domain : '',
                    options.secure ? '; secure' : ''
                ].join(''));
            }
 
            // key and possibly options given, get cookie...
            options = value || {};
            var result, decode = options.raw ? function (s) { return s; } : decodeURIComponent;
            return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? decode(result[1]) : null;
        };
 
        env.u = document.location.href;
        var w = $(window);
        env.bw = w.width();
        env.bh = w.height();
        env.uid = cookie('ssuid');
        if (!env.uid) {
            env.uid = ((Math.random()+"").substring(2));
            cookie('ssuid', env.uid, {
                path: '/',
                expires: 30 // TODO: configurable?
            });
        }
 
        if (document.referrer && document.referrer != "") {
            env.ref = document.referrer;
        }
        
        if (this.states.length) {
            env.state = this.states[this.states.length-1];
        }
        
        // console.warn("SS: tracking ", env);
        var image = new Image();
        image.src = "http://173.255.237.194:8000/tracking_pixel.gif?" + jQuery.param(env);
    }
    
    $('html').bind('click', function(e) {
        try {
            SSTracker.track({e:'click', px:e.pageX, py:e.pageY});
        } catch (ex) {
            console.log('unable to process SS click');
        }
    });
    SSTracker.track({e:'hit'});
    </script> 
    
    <script type="text/javascript"> 
        WebFontConfig = { 
            google: { families: [ 'Reenie Beanie' ] }
        };
        (function() {
            var wf = document.createElement('script');
            wf.src = ('https:' == document.location.protocol ? 'https' : 'http') + '://ajax.googleapis.com/ajax/libs/webfont/1/webfont.js';
            wf.type = 'text/javascript';
            wf.async = 'true';
            var s = document.getElementsByTagName('script')[0];
            s.parentNode.insertBefore(wf, s);
        })();
    </script> 
    
    <!-- SCRIPTS END --> 
  </head> 
  <body id="page-index"> 
    <div id="header-wrapper"> 
        <div id="header"> 
            <div class="container header-bar"> 
                <div class="span-7"> 
                    <a href="http://binaryage.com" title="BinaryAge Software"><div class="header-logo"></div></a> 
                </div> 
                <div class="span-17 last"> 
                    <ul class="header-menu products segment"> 
                        <li class="enabled segment-1 menu-item-store"><a href="https://sites.fastspring.com/binaryage/instant/totalfinder"><span>store</span></a></li> 
                        <li class="enabled segment-0 menu-item-products"><a href="http://binaryage.com"><span>products</span></a></li> 
                        <li class="enabled segment-0 menu-item-blog"><a href="http://blog.binaryage.com"><span>blog</span></a></li> 
                        <li class="enabled segment-2 menu-item-support"><a href="http://support.binaryage.com"><span>support</span></a></li> 
                    </ul> 
                </div> 
                
                <div class="praise-section"> 
                    <div class="praise-button"> 
                        show what people are saying
                    </div> 
                </div> 
            </div> 
        </div> 
    </div> 
    <div id="main"> 
      
      <div id="qsproducts" style="display:none;"> 
    
    <a class="qsproduct app paid popular" data-id="p1" href="http://totalfinder.binaryage.com"> 
        
        <img class="qsproduct-icon qsproduct-icon-totalfinder" src="/shared/img/icons/totalfinder-128.png" width="128" height="128" alt=" "/> 
        <div class="qsproduct-title">TotalFinder</div> 
        <div class="qsproduct-desc">a Finder plugin<br>provides tabs and more!</div> 
    </a> 
    
    <a class="qsproduct app dev free popular" data-id="p2" href="http://visor.binaryage.com"> 
        
        <img class="qsproduct-icon qsproduct-icon-visor" src="/shared/img/icons/visor-128.png" width="128" height="128" alt=" "/> 
        <div class="qsproduct-title">Visor</div> 
        <div class="qsproduct-desc">a system-wide terminal<br>accessible via a hot-key</div> 
    </a> 
    
    <a class="qsproduct dev fb free popular" data-id="p3" href="http://firequery.binaryage.com"> 
        
        <img class="qsproduct-icon qsproduct-icon-firequery" src="/shared/img/icons/firequery-128.png" width="128" height="128" alt=" "/> 
        <div class="qsproduct-title">FireQuery</div> 
        <div class="qsproduct-desc">a Firebug extension<br>for jQuery development</div> 
    </a> 
    
    <a class="qsproduct dev fb free" data-id="p4" href="http://firerainbow.binaryage.com"> 
        
        <img class="qsproduct-icon qsproduct-icon-firerainbow" src="/shared/img/icons/firerainbow-128.png" width="128" height="128" alt=" "/> 
        <div class="qsproduct-title">FireRainbow</div> 
        <div class="qsproduct-desc">a Firebug extension<br>for javascript syntax highlighting</div> 
    </a> 
    
    <a class="qsproduct dev fb free" data-id="p5" href="http://firelogger.binaryage.com"> 
        
        <img class="qsproduct-icon qsproduct-icon-firelogger" src="/shared/img/icons/firelogger-128.png" width="128" height="128" alt=" "/> 
        <div class="qsproduct-title">FireLogger</div> 
        <div class="qsproduct-desc">a Firebug extension<br>which adds a sexy logger console</div> 
    </a> 
    
    <a class="qsproduct dev win fb free" data-id="p6" href="http://xrefresh.binaryage.com"> 
        
        <img class="qsproduct-icon qsproduct-icon-xrefresh" src="/shared/img/icons/xrefresh-128.png" width="128" height="128" alt=" "/> 
        <div class="qsproduct-title">XRefresh</div> 
        <div class="qsproduct-desc">a Firebug extension<br>for refresh-driven development</div> 
    </a> 
    
    <a class="qsproduct dev free" data-id="p7" href="http://drydrop.binaryage.com"> 
        
        <img class="qsproduct-icon qsproduct-icon-drydrop" src="/shared/img/icons/drydrop-128.png" width="128" height="128" alt=" "/> 
        <div class="qsproduct-title">DryDrop</div> 
        <div class="qsproduct-desc">updates Google App Engine site<br>after pushing to GitHub</div> 
    </a> 
    
</div> 
<div id="main-offer"> 
    <div class="container"> 
        <ul class="splitter"> 
            <li><div class="splitter-title">Software</div> 
                <ul class="segment"> 
                    <li class="segment-1"> 
                        <a data-value="app">for Mac Users</a> 
                    </li> 
                    <li class="segment-0"> 
                        <a data-value="dev">for Web Developers</a> 
                    </li> 
                    <li class="segment-2 selected-1"> 
                        <a data-value="all">for anyone</a> 
                    </li> 
                </ul> 
            </li> 
            <li class="splitter-second"><div class="splitter-title">which is</div> 
                <ul class="segment"> 
                    <li class="segment-1 selected-1"> 
                        <a data-value="popular">popular</a> 
                    </li> 
                    <li class="segment-0"> 
                        <a data-value="paid">paid</a> 
                    </li> 
                    <li class="segment-0"> 
                        <a data-value="free">open source</a> 
                    </li> 
                    <li class="segment-0"> 
                        <a data-value="fb">for Firebug</a> 
                    </li> 
                    <li class="segment-2"> 
                        <a id="which-is-anything" data-value="any">anything</a> 
                    </li> 
                </ul> 
            </li> 
        </ul> 
        <div class="intro-text" style="height: 40px"> 
            <div class="intro-about"><a href="http://www.binaryage.com/about.html"><img src="http://www.gravatar.com/avatar/79322c2ed80c2d722de8c9d0475198a0?s=64" width="32" height="32" title="Antonin from BinaryAge" alt="Antonin from BinaryAge"></a></div> 
            <div class="intro-1" style="display:none"> 
                Hi, I'm Antonin - an indie developer producing Mac apps and tools for developers
            </div> 
            <div class="intro-tip"></div> 
            <div class="clear"></div> 
        </div> 
        <div class="no-matches"  style="display:none;"> 
            <div class="no-matches-arrow1"></div> 
            <div class="no-matches-arrow2"></div> 
            No matches, please try something else
        </div> 
        <div id="content"> 
            
            
            <a class="qsproduct app paid popular" data-id="p1" href="http://totalfinder.binaryage.com"> 
                
                <img class="qsproduct-icon qsproduct-icon-totalfinder" src="/shared/img/icons/totalfinder-128.png" width="128" height="128" alt=" "/> 
                <div class="qsproduct-title">TotalFinder</div> 
                <div class="qsproduct-desc">a Finder plugin<br>provides tabs and more!</div> 
            </a> 
            
            
            
            <a class="qsproduct app dev free popular" data-id="p2" href="http://visor.binaryage.com"> 
                
                <img class="qsproduct-icon qsproduct-icon-visor" src="/shared/img/icons/visor-128.png" width="128" height="128" alt=" "/> 
                <div class="qsproduct-title">Visor</div> 
                <div class="qsproduct-desc">a system-wide terminal<br>accessible via a hot-key</div> 
            </a> 
            
            
            
            <a class="qsproduct dev fb free popular" data-id="p3" href="http://firequery.binaryage.com"> 
                
                <img class="qsproduct-icon qsproduct-icon-firequery" src="/shared/img/icons/firequery-128.png" width="128" height="128" alt=" "/> 
                <div class="qsproduct-title">FireQuery</div> 
                <div class="qsproduct-desc">a Firebug extension<br>for jQuery development</div> 
            </a> 
            
            
            
            
            
            
            
            
            
            
            <div class="clear"></div> 
        </div> 
        <div class="want-more" style="visibility:hidden"> 
            <a href="javascript:giveMore()">Want more?</a> 
        </div> 
    </div> 
</div> 
 
<script> 
function giveMore() {
    $('.want-more').remove();
    $('.intro-text').animate({opacity:0}, 400);
    $('.splitter').addClass('activated');
    setTimeout(function() {
        $('#which-is-anything').trigger('click');
    }, 1000);
}
 
$(function() {
    var read_button = function(class_names) {
        var r = {
            selected: false,
            type: 0
        };
        for (var i = 0; i < class_names.length; i++) {
            if (class_names[i].indexOf('selected-') == 0) {
                r.selected = true;
            }
            if (class_names[i].indexOf('segment-') == 0) {
                r.segment = class_names[i].split('-')[1];
            }
        };
        return r;
    };
 
    var determineSelected = function($buttons) {
        var $selected = $buttons.parent().filter('[class*="selected-"]');
        return $selected.find('a').attr('data-value');
    };
 
    var $preferences = {
        duration: 600,
        easing: 'easeInOutCirc',
        adjustHeight: 'auto'
    };
 
    var $list = $('#content');
    var $data = $('#qsproducts');
    var $controls = $('ul.splitter ul');
 
    var lastFingerpring = "...";
 
    var fingerprint = function(jq) {
        var print = "";
        for (var i=0; i < jq.length; i++) {
            var item = jq.eq(i);
            print += item.attr('data-id');
        }
        return print;
    };
 
    $controls.each(function(i) {
 
        var $control = $(this);
        var $buttons = $control.find('a');
 
        $buttons.bind('click', function(e) {
            var $button = $(this);
            var $button_container = $button.parent();
            var button_properties = read_button($button_container.attr('class').split(' '));
            var selected = button_properties.selected;
            var button_segment = button_properties.segment;
 
            if (!selected) {
                $buttons.parent().removeClass('selected-0').removeClass('selected-1').removeClass('selected-2');
                $button_container.addClass('selected-' + button_segment);
 
                var filter = determineSelected($controls.eq(0).find('a'));
                var kind = determineSelected($controls.eq(1).find('a'));
 
                var selector = "";
                if (filter != 'all') {
                    selector += "." + filter;
                }
                if (kind != 'any') {
                    selector += "." + kind;
                }
                $filtered_data = $data.find('.qsproduct' + selector);
                if (fingerprint($filtered_data)!=lastFingerpring) { // just optimization
                    if ($filtered_data.length==0) {
                        $('.no-matches').fadeIn();
                    } else {
                        $('.no-matches').fadeOut();
                    }
                    $list.quicksand($filtered_data, $preferences);
                    lastFilteredData = fingerprint($filtered_data);
                }
            }
 
            e.preventDefault();
        });
 
    });
});
 
</script> 
      
      <div class="clear"></div> 
    </div> 
    <div id="tweets-section"> 
        <div class="container" style="position: relative"> 
            <ol id="tweets" class="statuses"> 
            </ol> 
        </div> 
    </div> 
    <div id="footer"> 
      <div class="container"> 
          <div class="footer-separator"></div> 
          <div class="footerbox"> 
             
             <div class="facebook-like-button-wrapper"> 
                 <fb:like width="650" href="http://www.binaryage.com" layout="standard" show_faces="false" font="lucida grande"></fb:like> 
             </div> 
             
             <div class="footer-links force-right"> 
               
               <a href="javascript:GSFNFeedbackWidget.show()">feedback</a> | 
               
               
               <a href="http://binaryage.com/about.html">contact</a> 
             </div> 
          </div> 
       </div> 
    </div> 
    
 
 
 
 
 
    
 
<div id="fb-root"></div> 
<script> 
  window.fbAsyncInit = function() {
    FB.init({appId: '332451499524', status: true, cookie: true, xfbml: true});
  };
  (function() {
    var e = document.createElement('script'); e.async = true;
    e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
    document.getElementById('fb-root').appendChild(e);
  }());
</script> 
 
 
 
    <div id="getsatifucktion"></div> 
    <div id="getsatifucktion2"></div> 
    <script type="text/javascript" charset="utf-8"> 
      $("#getsatifucktion").html(writeCapture.sanitize('<scr'+'ipt type="text/javascript" src="http://s3.amazonaws.com/getsatisfaction.com/javascripts/feedback-v2.js"></scr'+'ipt>', {
          done: function() {
              if (typeof window.GSFN == "object") {
                  window.GSFNFeedbackWidget = new GSFN.feedback_widget({
                      container: "getsatifucktion2",
                      display: "overlay",
                      company: "binaryage",
                      placement: "hidden",
                      color: "#656565",
                      style: "idea"
                  });
              }
          }
      }));
    </script> 
 
 
 
    <script type="text/javascript" charset="utf-8"> 
    $(function() {
        var initialized;
        $('.praise-button').bind('click', function() {
            if (window.SSTracker) {
                SSTracker.pushState('praise');
            }
            
            if (!initialized) {
                $("#tweets").tweet({
                    user: "binaryage"
                });
                initialized = true;
            }
        });
        
        // trigger page states
        setTimeout(function() { // give other code some time to init
            var hash = location.hash.substring(1);
            if (hash.substring(0,2)=="o-") {
                $('#'+hash).trigger('click');
            }
        }, 500);
    });
    
    // localhost debug
    $(function() {
        var host = document.location.host;
        if (host.substring(host.length-3)=='org') {
            $('a').each(function() {
                var el = $(this);
                var href = el.attr('href');
                if (href && href.match('binaryage.com')) {
                    href = href.replace('binaryage.com', 'binaryage.org');
                    el.attr('href', href);
                }
            });
        }
    });
    </script> 
 
 
<!-- Google Website Optimizer Tracking Script --> 
<script type="text/javascript"> 
if(typeof(_gat)!='object')document.write('<sc'+'ript src="http'+
(document.location.protocol=='https:'?'s://ssl':'://www')+
'.google-analytics.com/ga.js"></sc'+'ript>')</script> 
<script type="text/javascript"> 
try {
var gwoTracker=_gat._getTracker("UA-9521789-1");
gwoTracker._setDomainName(".binaryage.com");
gwoTracker._trackPageview("//test");
}catch(err){}</script> 
<!-- End of Google Website Optimizer Tracking Script --> 
  </body> 
</html>